﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
using DTO;

namespace DAO
{
    public class HoaDonBan_Dao
    {
        private readonly BaseOperationImplement<HoaDonBan_Dto> _baseOperationImp = new BaseOperationImplement<HoaDonBan_Dto>();
        public DataSet GetAllObject()
        {
            string query = @"SELECT cthdb.MaHDB, cthdb.MaSP, cthdb.SoLuong
                                ,sp.GiaBan, cthdb.KhuyenMai,cthdb.ThanhTien
                                , hdb.NgayBan, hdb.MaNV, hdb.MaKH
                                FROM dbo.ChiTietHDB cthdb 
                                JOIN dbo.HoaDonBan hdb
                                ON cthdb.MaHDB = hdb.MaHDB
                                JOIN dbo.SanPham sp
                                ON cthdb.MaSP = sp.MaSP
                                ORDER BY cthdb.MaHDB DESC";
            return _baseOperationImp.GetDataSet(query);
        }

        /// <summary>
        /// Báo cáo ds các hoá đơn bán của một mặt hàng và quý được chọn trước
        /// </summary>
        /// <returns></returns>
        public IList<HoaDonBan_Dto> GetHoaDonBans(string maMH, int quy)
        {
            int quater = 0;
            IList<HoaDonBan_Dto> result = null;
            IList<HoaDonBan_Dto> lstQuy1 = new List<HoaDonBan_Dto>();
            IList<HoaDonBan_Dto> lstQuy2 = new List<HoaDonBan_Dto>();
            IList<HoaDonBan_Dto> lstQuy3 = new List<HoaDonBan_Dto>();
            IList<HoaDonBan_Dto> lstQuy4 = new List<HoaDonBan_Dto>();

            IDictionary<int, IList<HoaDonBan_Dto>> hoaDonBans = new Dictionary<int, IList<HoaDonBan_Dto>>();
            string query = @"select hdb.MaHDB,hdb.NgayBan,hdb.MaNV,
                            hdb.MaKH,hdb.TongTien
                            from dbo.ChiTietHDB cthdb
                            join dbo.HoaDonBan hdb
                            on cthdb.MaHDB = hdb.MaHDB
                            where MaSP = '"+ maMH +  "'";
            DataTable dt = _baseOperationImp.GetDataTable(query);

            foreach (DataRow  dr in dt.Rows)
            {
                HoaDonBan_Dto hdbDto = new HoaDonBan_Dto();
                PropertyInfo[]    proInfos  =  hdbDto.GetType().GetProperties();
                for (int i = 0; i < proInfos.Length; i++)
                {
                    proInfos[i].SetValue(hdbDto, Convert.ChangeType(dr.ItemArray[i], proInfos[i].PropertyType), null);
                    //IList<HoaDonBan_Dto> lstHDB = new List<HoaDonBan_Dto>();
                    if (proInfos[i].Name.Equals("NgayBan"))
                    {
                        int month = int.Parse(DateTime.Parse(dr.ItemArray[i].ToString()).Month.ToString());
                        
                        switch (month)
                        {
                            case 1:
                            case 2:
                            case 3:
                                quater = 1;
                                AddObjectToDic(hoaDonBans, quater, lstQuy1, hdbDto);
                                break;
                            case 4:
                            case 5:
                            case 6:
                                quater = 2;
                                AddObjectToDic(hoaDonBans, quater, lstQuy2, hdbDto);
                                break;
                            case 7: 
                            case 8:
                            case 9:
                                quater = 3;
                                AddObjectToDic(hoaDonBans, quater, lstQuy3, hdbDto);
                                break;
                            case 10: 
                            case 11: 
                            case 12:
                                quater = 4;
                                AddObjectToDic(hoaDonBans, quater, lstQuy4, hdbDto);
                                break;
                        }

                    }
                }
            }

            return hoaDonBans.TryGetValue(quy, out result) ? result : null;
        }

        //Báo cáo doanh thu của cửa hàng theo nhân viên và tháng chọn trước.
        public DataSet GetDoanhThu(string manv, int thang)
        {
            return _baseOperationImp.GetDataSet("select * from dbo.HoaDonBan where MaNV = '" + manv + "' and month(NgayBan) = " + thang +"");
        }

        private void AddObjectToDic(IDictionary<int, IList<HoaDonBan_Dto>> dic, int key, IList<HoaDonBan_Dto> values, HoaDonBan_Dto hoaDonObj)
        {
            if (dic.ContainsKey(key))
            {
                dic[key] = values;
            }
            else
            {
                dic.Add(key, values);
            }
            values.Add(hoaDonObj);
        }

        public int AddObject(string mahdb, string ngayban, string manv, string makh, string masp, int soluong, int khuyenmai, decimal giaban)
        {
            return _baseOperationImp.AddObject("insHDB", CommandType.StoredProcedure, "@mahdb", mahdb, "@ngayban", ngayban, "@manv"
                , manv, "@makh", makh, "@masp", masp, "@soluong", soluong, "@km", khuyenmai, "@dongia", giaban);
        }

        public int EditObject(string mahdb, string ngayban, string manv, string mankh, string masp, int soluong, decimal giaban, int khuyenmai)
        {
            return _baseOperationImp.EditObject("updateHdb", CommandType.StoredProcedure, "@mahdb", mahdb, "@ngayban", ngayban, "@manv"
                , manv, "@makh", mankh, "@masp", masp, "@soluong", soluong, "@giaban", giaban, "@km", khuyenmai);
        }

        public int DeleteObject(string mdHdb)
        {
            return _baseOperationImp.DeleteObject("delHDB", CommandType.StoredProcedure, "@id", mdHdb);
        }

        public int AutoIncrementIdObject()
        {
            return _baseOperationImp.AutoIncrementIdObject("HoaDonBan", "MaHDB");
        }
    }
}

